﻿#ifndef SYSTIMER_H
#define SYSTIMER_H

#include <QObject>
#include <QList>
#include "udpsys.h"
#include "myxml.h"

#define TEST_DEV_NUM	100

class QUdpSocket;
class QTcpServer;
class QTcpSocket;
class Reporter;
class TestSetup;
class DeviceSetup;

class Systimer : public QObject
{
    Q_OBJECT
public:
	enum TESTSTAT {
		TEST_WAIT,		//等待测试
		TEST_RUNING,	//正在测试
		TEST_OUTTIME,	//测试超时
		TEST_ERR,		//测试异常
		TEST_END,		//测试结束
	};
    enum LOGLEVEL{
        LOG_DEBUG = 0,
        LOG_INFO  = 1,
        LOG_WARN  = 2,
        LOG_ERR   = 3,
    };
    Systimer();
    ~Systimer();
    /* qml 使用函数-网络配置 */
    Q_INVOKABLE void setLocalIPAddress(QString ipstr);      // 根据选择，设置本机通信的广播地址
    Q_INVOKABLE void pingTest(QString ipstr);               // 进行ping测试，用于测试本机网络
	/* qml 使用函数-测试控制 */
    Q_INVOKABLE void autoTestSwitch(bool isStart, bool isManual);          // 开始/停止自动测试
    Q_INVOKABLE void turnOffAll(bool isReboot);             // 关机/重启全部设备
    Q_INVOKABLE void setPoweroffAuto(bool isPoweroff);      // 测试完成后自动关机
	/* qml 使用函数-测试脚本解析 */
	Q_INVOKABLE void  changeTestCase(QString filePath);     // 更改测试实例脚本
    Q_INVOKABLE void testCaseSetup();
	Q_INVOKABLE QString  getDevTestCaseStr(int devIndex, int cmdIndex, int cmdRepeatIndex);      // 获取测试实例显示字符串
    /* qml 使用函数-设备控制 */
    Q_INVOKABLE void testDevControl(int devIndex);          // 重启/停止测试的控制
    Q_INVOKABLE void testDevSetup(int devIndex);          // 设备硬件设置

protected:
    void timerEvent(QTimerEvent *);

signals:
    /* qml 使用信号 */
    void statusTrigger(int devIndex, QString macStr, QString ipStr, int cpuRate, int memRate, int cpuTemp, int vdoTemp, int hddTemp);     //设备信息改变
    void testDevTrigger(int devIndex, bool online, int cmdIndex, int cmdRepeatIndex, int devStatus);            //设备测试信息改变
    void testProcessTrigger(int devIndex, int currentTime, int currentProcess, int totalProcess);               //设备测试进度改变
    // ledStat: 0[正常，绿色闪烁] 1[警告状态：重启/关机，一般为黄色常亮] -1[异常: 红色闪烁或者常亮]
    void testDevStatTrigger(int devIndex, int level, QString statusStr);            //设备状态信息【左下角显示的提示信息】改变
    void networkConfig(QString localIP1, QString localIP2, QString localIP3);       // 网络配置改变
    void pingTestRet(QString logTxt);                                               // 网络ping测试反馈
    void testcaseConfig(int testcaseCounts);                                        // 测试脚本改变
    void testAllEned();                                                             // 测试结束

private slots:
    void socketDataReceived_1();
    void socketDataReceived_2();
    void onTcpserver_newConnect();
    void onTcpserver_dataReceived();
    void onTcpserver_disConnect();
    void onInitLater();
    void starteOneOrder(int box_index, QString cmdstr, int timeOuts);                       // 发送一条命令给slave端
    void starteOneOrder_udp(int box_index, QString cmdstr, int timeOuts);                   // 发送一条命令给slave端，强制用udp报文
    void starteLater();


private:
    int     timerID;                //定时器ID
    QUdpSocket *udpSocket_1;        // udp socket 1
    QUdpSocket *udpSocket_2;        // udp socket 2
    QTcpServer *tcpServer;
    // QTcpSocket *tcpSocket;
    QList< QTcpSocket *> tcpSocketList;
    QList< QString >     tcpSocketIPList;
    SetupCase   setupcase;
    QStringList ipDevList;
    QString localIP;                //本机IP地址
    QString localGateway;           //本机网关
    QString localBroadcast;         //本机广播地址
    QList<UdpDevice >   udpDeviceList;      //下位机设备列表
    QList<TestCase>     testCaseList;       //测试实例列表
	QList<QStringList > testCasestrModel;	//测试实例 详情
    Reporter *reporter;             // 产生测试报告页面
    TestSetup *testsetup;           // 测试配置
    DeviceSetup *devicesetup;       // 设备配置（MAC+硬件测试）
    bool        isTestendPoweroff;  // 测试完成后关机

    /* 测试脚本相关 */
    void loadTestScript(QString devName, QString fileName);
	QStringList getTestcaseDetail(int index);
    /* udp通信相关 */
    void refreshDevStatus();      //发送广播，获取下位机节点信息（MAC/CPU/MEM/TEMP）
    void processUdpData(QUdpSocket *udpSocket);     // 处理UDP传回的数据
    void processTcpData(QTcpSocket *tcpSocket);     // 处理TCP传回的数据
    void processRecvData(QByteArray &datagram, QHostAddress &hostAddress);
    void starteOneOrderLater(int box_index, QString cmdstr, int timeOuts, int delay_S);     // 延时 发送一条命令给slave端
    /* 设备信息管理相关 */
    bool refreshUdpDevice(QString macStr, QString ipAddress, int cpuRate, int memRate, int cpuTemp, int vdoTemp, int hddTemp);
    int getIndexFromUList(const QList<UdpDevice> &uDList, QString macStr);      // 从列表中获取udpdevice设备索引,通过mac地址
    int getIndexFromUListIP(const QList<UdpDevice> &uDList, QString ipStr);     // 从列表中获取udpdevice设备，通过IP地址刷新主界面设备信息
    QString getResultFormOUT(QString outstr, QString cmdStart, QString cmdEnd, int cmdIndex);
    QString resultHandle(QString result, int cmdIndex);
    /* 网络配置相关 */
    QStringList getLocalmachineIP();                // 获取本机IP地址

    void appendLog(QString logstr, int loglevel);     // 在主界面log框添加日志信息
};

#endif // SYSTIMER_H
